home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Magazin/MacEasy 24
/
Mac Magazin and MacEasy Magazine CD - Issue 24.iso
/
System
/
Icons & Texturen
/
Paper Paster 1.0
/
Paper Paster Source Code
/
WallPaperConvert.c
< prev
Wrap
Text File
|
1993-03-25
|
12KB
|
671 lines
// -----------------------------------------------------------------------
// -- WallPaperConvert.c, convert a Wallpaper file to a 'ppat' resource
// -----------------------------------------------------------------------
// -----------------------------------------------------------------------
// -- #include files
// -----------------------------------------------------------------------
// -- #defines for WallPaperConvert.c
#define VERSION_SUPPORTED 2
#define PIX_DEPTH_OFFSET 10
#define NUM_COLORS_OFFSET 11
#define COLOR_TABLE_OFFSET 12
// -----------------------------------------------------------------------
// -- Typedef's for WallPaperConvert.c
typedef struct ppatRes
{
// -- The header...
int patType;
long pixMapOffset;
long pixDataOffset;
long patXData;
int patXValid;
long patXMap;
Pattern pat1Data;
// -- The pixMap...
long baseAddr;
int rowBytes;
Rect bounds;
int pmVersion;
int packType;
long packSize;
long hRes;
long vRes;
int pixelType;
int pixelSize;
int cmpCount;
int cmpSize;
long planeBytes;
long pmTable;
long pmReserved;
} ppatRes, *ppatResPtr, **ppatResHandle;
// -----------------------------------------------------------------------
// -- Function prototypes
PixPatHandle ResToPixPat(Handle ppatHandle);
Handle ConvertWallPaper(Handle rawData);
Boolean VersionCheck(Handle rawData);
Handle CreateHeader(Handle rawData);
Boolean AppendPixelData(Handle ppatHeader, Handle rawData);
Boolean AppendColorTable(Handle ppatHeader, Handle rawData);
// -----------------------------------------------------------------------
// -- Convert a 'ppat' resource to a PixPatHandle
PixPatHandle ResToPixPat(Handle ppatHandle)
{
PixPatHandle result = nil;
PixMapHandle pMap;
Handle pData;
CTabHandle cTab;
long dataSize, cTabSize;
int err;
// -- Figure out how much space is needed for the color table & pixel data
asm
{
move.l ppatHandle, A0
move.l (A0), A0
// -- First, get the pixel data size
clr.l D0
move.w OFFSET(ppatRes, rowBytes)(A0), D0
bclr #15, D0
bclr #14, D0
bclr #13, D0
clr.l D1
move.w OFFSET(ppatRes, bounds.bottom)(A0), D1
mulu D0, D1
move.l D1, dataSize
// -- Now get the size of the color table
move.l OFFSET(ppatRes, pmTable)(A0), D0
add.l D0, A0
move.l (A0)+, D0
move.w (A0)+, D0
clr.l D0
move.w (A0)+, D0
add.w #1, D0
mulu #8, D0
add.w #8, D0
move.l D0, cTabSize
}
// -- Allocate our PixMapHandle
pMap = (PixMapHandle)NewHandle(sizeof(PixMap));
if (pMap != nil)
{
// -- Allocate the pattern data buffer
pData = NewHandle(dataSize);
if (pMap == nil)
{
DisposHandle((Handle)pMap);
}
else
{
// -- Allocate our CTabHandle
cTab = (CTabHandle)NewHandle(cTabSize);
if (cTab == nil)
{
DisposHandle((Handle)pMap);
DisposHandle(pData);
}
else
{
// -- Allocate our PixPatHandle
result = (PixPatHandle)NewHandle(sizeof(PixPat));
if (result == nil)
{
DisposHandle((Handle)pMap);
DisposHandle((Handle)cTab);
DisposHandle(pData);
}
else
{
// -- Fill in our PixPatHandle
MoveHHi((Handle)result);
MoveHHi(ppatHandle);
HLock((Handle)result);
HLock(ppatHandle);
BlockMove(*ppatHandle, *result, sizeof(PixPat));
(**result).patMap = pMap;
(**result).patData = pData;
(**result).patXValid = -1;
// -- Now fill out the PixMapHandle
asm
{
move.l ppatHandle, A0
move.l (A0), A0
move.l OFFSET(ppatRes, pixMapOffset)(A0), D0
add.l D0, A0
move.l pMap, A1
move.l (A1), A1
move.l #sizeof(PixMap), D0
_BlockMove
}
(**pMap).baseAddr = (*pData);
(**pMap).pmTable = cTab;
// -- Set up the pixel data handle
asm
{
move.l ppatHandle, A0
move.l (A0), A0
move.l OFFSET(ppatRes, pixDataOffset)(A0), D0
add.l D0, A0
move.l pData, A1
move.l (A1), A1
move.l dataSize, D0
_BlockMove
}
// -- Set up the color table handle
asm
{
move.l ppatHandle, A0
move.l (A0), A0
move.l OFFSET(ppatRes, pmTable)(A0), D0
add.l D0, A0
move.l cTab, A1
move.l (A1), A1
move.l cTabSize, D0
_BlockMove
}
(**cTab).ctSeed = GetCTSeed();
// -- Allocate the X structures
(**result).patXMap = NewHandle(sizeof(PixMap));
if ((**result).patXMap == nil)
{
DisposHandle((Handle)result);
DisposHandle((Handle)pMap);
DisposHandle((Handle)cTab);
DisposHandle(pData);
result = nil;
}
else
{
(**result).patXData = NewHandle(2);
if ((**result).patXData == nil)
{
DisposHandle((Handle)(**result).patXMap);
DisposHandle((Handle)result);
DisposHandle((Handle)pMap);
DisposHandle((Handle)cTab);
DisposHandle(pData);
result = nil;
}
}
// -- Clean up
if (result != nil)
HUnlock((Handle)result);
HUnlock(ppatHandle);
}
}
}
}
DisposHandle(ppatHandle);
return result;
} // -- ResToPixPat
// -----------------------------------------------------------------------
// -- Convert a wallpaper file to a 'ppat' resource
Handle ConvertWallPaper(Handle rawData)
{
Handle result = nil;
Handle ppatHeader;
if (rawData != nil)
{
// -- Make sure this is a Wallpaper version we can handle
if (VersionCheck(rawData))
{
// -- Create the 'ppat' header and fill it in
ppatHeader = CreateHeader(rawData);
if (ppatHeader != nil)
{
// -- Add the pattern's pixel data to the recipe
if (AppendPixelData(ppatHeader, rawData))
{
// -- Finally, add the color table
if (AppendColorTable(ppatHeader, rawData))
{
// -- We've got our converted 'ppat' resource; return it
result = ppatHeader;
}
}
}
}
// -- Get rid of the rawData handle
DisposHandle(rawData);
}
return result;
} // -- ConvertWallPaper
// -----------------------------------------------------------------------
// -- Add the pixel information to the 'ppat' resource
Boolean AppendPixelData(Handle ppatHeader, Handle rawData)
{
Boolean result = true;
asm
{
move.l D6, -(SP)
move.l ppatHeader, A0
_GetHandleSize
move.l D0, -(SP)
move.l ppatHeader, A0
move.l (A0), A1
// -- Calculate how much bigger we should make this handle
clr.l D0
move.w OFFSET(ppatRes, rowBytes)(A1), D0
clr.l D1
move.w OFFSET(ppatRes, bounds.right)(A1), D1
mulu.w D1, D0
move.l D0, D6
add.l (SP)+, D0
_SetHandleSize
tst.w MemErr
bne @memoryError
// -- Now blockmove the pixel data in
move.l rawData, A0
move.l (A0), A0
add.w #NUM_COLORS_OFFSET, A0
clr.l D0
move.b (A0)+, D0
add.w #1, D0
mulu.w #3, D0
add.w D0, A0
add.w #2, A0
move.l ppatHeader, A1
move.l (A1), A1
move.l OFFSET(ppatRes, pixDataOffset)(A1), D0
add.l D0, A1
move.l D6, D0
_BlockMove
bra @out
@memoryError
move.l ppatHeader, A0
_DisposHandle
clr.l ppatHeader
move.b #false, result
@out
move.l (SP)+, D6
}
return result;
} // -- AppendPixelData
// -----------------------------------------------------------------------
// -- Add the color table to the 'ppat' resource
Boolean AppendColorTable(Handle ppatHeader, Handle rawData)
{
Boolean result = true;
asm
{
move.l D6, -(SP)
move.l ppatHeader, A0
_GetHandleSize
move.l D0, -(SP)
// -- figure out how much bigger the 'ppat' needs to be
move.l rawData, A1
move.l (A1), A1
add.w #NUM_COLORS_OFFSET, A1
clr.l D0
move.b (A1), D0
add.w #1, D0
mulu #8, D0
add.w #8, D0
add.l (SP)+, D0
// -- Make the handle bigger
move.l ppatHeader, A0
_SetHandleSize
tst.w MemErr
bne @memoryError
// -- expand the color table
move.l ppatHeader, A1
move.l (A1), A1
move.l OFFSET(ppatRes, pmTable)(A1), D0
add.l D0, A1
move.l #0, (A1)+ // -- ctSeed
move.w #0, (A1)+ // -- ctFlags
move.l rawData, A0
move.l (A0), A0
add.w #NUM_COLORS_OFFSET, A0
clr.l D0
move.b (A0)+, D0
move.w D0, (A1)+ // -- ctSize
clr.l D6
@colorTableLoop
move.w D6, (A1)+
add.w #1, D6
// -- Red
move.b (A0)+, D1
move.b D1, (A1)+
move.b D1, (A1)+
// -- Green
move.b (A0)+, D1
move.b D1, (A1)+
move.b D1, (A1)+
// -- Blue
move.b (A0)+, D1
move.b D1, (A1)+
move.b D1, (A1)+
dbra D0, @colorTableLoop
// -- Lastly, let 'em know this is a color pixmap
move.l ppatHeader, A0
move.l (A0), A0
add.w #0x8000, OFFSET(ppatRes, rowBytes)(A0)
bra @out
@memoryError
move.l ppatHeader, A0
_DisposHandle
clr.l ppatHeader
move.b #false, result
@out
move.l (SP)+, D6
}
return result;
} // -- AppendColorTable
// -----------------------------------------------------------------------
// -- Create the 'ppat' resource header
Handle CreateHeader(Handle rawData)
{
Handle result = nil;
long dataOffset, cTabOffset;
dataOffset = sizeof(ppatRes);
cTabOffset = sizeof(ppatRes);
result = NewHandle(sizeof(ppatRes));
if (result != nil)
{
// -- Fill in the default values of the 'ppat' header
asm
{
move.l D3, -(SP)
move.l A2, -(SP)
// -- Load in pointers to our data blocks
move.l result, A0
move.l (A0), A0
move.l rawData, A1
move.l (A1), A1
// -- Fill out the header information
move.w #1, (A0)+ // -- full color pattern
move.l #28, (A0)+ // -- offset to pixmap record
move.l dataOffset, (A0)+ // -- offset to pixel data
move.l #0, (A0)+ // -- patXData
move.w #-1, (A0)+ // -- patXValid
move.l #0, (A0)+ // -- patXMap
move.l #0xAA55AA55, (A0)+ // -- b/w pattern
move.l #0xAA55AA55, (A0)+ // -- b/w pattern
// -- Fill out the pixmap information
move.l #0, (A0)+ // -- baseAddr
// -- We have to bypass the variable-length miniature clut to get the rowBytes
move.l A1, A2
add.w #NUM_COLORS_OFFSET, A2
clr.l D0
move.b (A2)+, D0
add.w #1, D0
mulu.w #3, D0
add.w D0, A2
move.w (A2), D0
move.w D0, (A0)+ // -- rowBytes
move.l D0, D3
// -- We have to compute the bounds from the rowBytes and pixelSize
clr.l D1
move.b PIX_DEPTH_OFFSET(A1), D1
// -- Is it a 1 bit pixmap?
cmp.w #1, D1
bne @not1
mulu.w #8, D0
bra @gotBounds
@not1
// -- Is it a 2 bit pixmap?
cmp.w #2, D1
bne @not2
mulu.w #4, D0
bra @gotBounds
@not2
// -- Is it a 4 bit pixmap?
cmp.w #4, D1
bne @not4
mulu.w #2, D0
bra @gotBounds
@not4
// -- Is it a 8 bit pixmap?
cmp.w #8, D1
bne @not8
bra @gotBounds
@not8
// -- Is it a 16 bit pixmap?
cmp.w #16, D1
bne @not16
divu.w #2, D0
bra @gotBounds
@not16
// -- Is it a 32 bit pixmap?
cmp.w #32, D1
bne @not32
divu.w #4, D0
bra @gotBounds
@not32
// -- We should never get here...
_Debugger
@gotBounds
move.w #0, (A0)+ // -- bounds.top
move.w #0, (A0)+ // -- bounds.left
move.w D0, (A0)+ // -- bounds.bottom
move.w D0, (A0)+ // -- bounds.right
move.w #0, (A0)+ // -- pmVersion
move.w #0, (A0)+ // -- packType
move.l #0, (A0)+ // -- packSize
move.l #0x00480000, (A0)+ // -- hRes
move.l #0x00480000, (A0)+ // -- vRes
move.w #0, (A0)+ // -- chunky
move.w D1, (A0)+ // -- bits per pixel
move.w #1, (A0)+ // -- cmpCount
move.w D1, (A0)+ // -- cmpSize = bits per pixel
move.l #0, (A0)+ // -- planeBytes
// -- Add the size of the pixel data to the cTabOffset
mulu.w D3, D0
add.l D0, cTabOffset
move.l cTabOffset, (A0)+ // -- Offset to the color table
move.l #0, (A0)+ // -- pmReserved
move.l (SP)+, A2
move.l (SP)+, D3
}
}
return result;
} // -- CreateHeader
// -----------------------------------------------------------------------
// -- Make sure this is a Wallpaper version we can handle
Boolean VersionCheck(Handle rawData)
{
Boolean versOK;
asm
{
move.b #0, D0
move.l rawData, A0
move.l (A0), A0
cmp.w #VERSION_SUPPORTED, (A0)
seq D0
move.b D0, versOK
}
return versOK;
} // -- VersionCheck